package com.lx.kafka.Properties;

import com.lx.kafka.partition.MyPartition;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

/**
 * Description:
 * Copyright:   Copyright (c)2019
 * Company:     zefu
 *
 * @author: 张李鑫
 * @version: 1.0
 * Create at:   2022-02-19 13:35:00
 * <p>
 * Modification History:
 * Date         Author      Version     Description
 * ------------------------------------------------------------------
 * 2022-02-19     张李鑫                     1.0         1.0 Version
 */
public class ProducerProperties {

    public Properties properties;

    /**
     * isr:动态的 in-sync replica set 保持跟leader同步的集合
     * 如果从节点长时间没有向leader请求或者同步数据 就会把那个节点踢出集合。
     * <p>
     * <p>
     * 数据完全可靠条件：
     * ack=-1 分区大小大于1 isr应答的最小副本大于1
     *
     *
     */

    public ProducerProperties() {
        properties = new Properties();
        //连接信息
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        //key序列化
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        //value序列化
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        //设置自定义分区选择器
        properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, MyPartition.class.getName());

        //缓冲区大小
        properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
        //批次大小
        properties.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
        //linger.ms
        properties.put(ProducerConfig.LINGER_MS_CONFIG, 10);
        //压缩
        properties.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");
//      ack:
//      0:不需要等数据落盘 只要发送出去就成功
//      1：生产者发送数据 leader收到数据后应答才算成功
//      -1:leader把消息同步到从节点以后才算成功
        properties.put(ProducerConfig.ACKS_CONFIG, "1");
        //重试次数
        properties.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG,3);
    }

    /**
     * 吞吐量提高
     * 1） 设置批次大小 16k—32k
     * 2） linger.ms  等待时间 5-100ms
     * 3）压缩
     * 4）缓存大小
     *
     *
     * 幂等性：
     * pid 分区号 序列号 每次重启 pid重启分配
     *
     * 事务：
     * 基于幂等实现
     *
     */
}
